package org.apli.haiam.ejb.interfaces;

import java.util.Date;
import java.util.List;
import javax.ejb.Local;
import org.apli.haiam.admin.entidades.ParametrosReporte;

/**
 * Interfaz que declarado métodos necesarios para el modulo de consulta Externa.
 * <p>
 * <H6>Soporte:HAIAM
 * <I>david_s_1086@hotmail.com,david.carranza@haiam.gob.ec</I></H6>
 *
 * @author david Carranza
 * @version 1.0 30/07/2014
 * @param <T>
 */
@Local
public interface ConsExternaAdministrador<T> {

    /**
     * Modifica un registro en la tabla agenda cambiando su estado a 1 en
     * auditoria grabando como que se creo un turnoa La clase de entidad (EJB3).
     * <p /> Detalle:<br /> UPDATE T SET (...) = (...) WHERE ID = ... <p />
     * Modifica los atributos de UN registro de la tabla T que corresponda a la
     * clave primaria que se encuentra en la entidad. <br />
     *
     * @param entity La entidad a modificar.
     * @param user El usuario que modifica la entidad.
     * @throws Exception Si existe un error.
     */
    public void crearTurno(T entity, Object user) throws Exception;

    /**
     * Modifica un registro en la tabla CexConsulta cambiando su estado a 2,
     * ademas cambia el estado de la agenda a estado 3 y de la preparacion a
     * estado 2 auditoria grabando como que se creo un turnoa La clase de
     * entidad (EJB3).
     * <p /> Detalle:<br /> UPDATE T SET (...) = (...) WHERE ID = ... <p />
     * Modifica los atributos de UN registro de la tabla T que corresponda a la
     * clave primaria que se encuentra en la entidad. <br />
     *
     * @param entity La entidad a modificar.
     * @param user El usuario que modifica la entidad.
     * @throws Exception Si existe un error.
     */
    public void concluirConsulta(T entity, Object user) throws Exception;

    /**
     * Crea un registro en la tabla asociada a la clase de entidad (EJB3).
     *
     * @param entity la entidad a crear
     * @param user el usuario que crea la entidad
     * @throws Exception si existe un error
     */
    public void crearMaestroDetalle(T entity, Object user) throws Exception;

    /**
     * Modifica un registro en la tabla asociada a la clase de entidad con su
     * lista anexada(EJB3).
     *
     * @param entity la entidad a crear
     * @param user el usuario que modifica la entidad
     * @throws Exception si existe un error
     */
    public void modificarMaestroDetalle(T entity, Object user) throws Exception;

    /**
     * Modifica un registro en la tabla agenda cambiando su estado a 0 en
     * auditoria grabando como que se cancelo un turnoa La clase de entidad
     * (EJB3). <p /> Detalle:<br /> UPDATE T SET (...) = (...) WHERE ID = ... <p
     * /> Modifica los atributos de UN registro de la tabla T que corresponda a
     * la clave primaria que se encuentra en la entidad. <br />
     *
     * @param entity La entidad a modificar.
     * @param user El usuario que modifica la entidad.
     * @param ageId
     * @param hClinica
     * @param secuencia
     * @throws Exception Si existe un error.
     */
    public void cancelarTurno(T entity, Object user, Integer ageId, String hClinica, String secuencia) throws Exception;

    /**
     * Crea un registro en la tabla asociada a la clase de entidad (EJB3).
     *
     * @param entity la entidad a crear
     * @param user el usuario que crea la entidad
     * @throws Exception si existe un error
     */
    public void crearTransaccion(T entity, Object user) throws Exception;

    /**
     * Modifica un registro en la tabla asociada a la clase de entidad (EJB3).
     *
     * @param entity la entidad a crear
     * @param user el usuario que modifica la entidad
     * @throws Exception si existe un error
     */
    public void modificarTransaccion(T entity, Object user) throws Exception;

    /**
     * Verifica si existe un registro en la tabla asociada a una clase de
     * entidad que cumpla un patrón de búsqueda (EJB3). <p /> Detalle:<br />
     * Select COUNT(T) FROM T WHERE propiedad1 = valor1 AND propiedad2 = valor2
     * AND propiedad3 = valor3 <br />
     *
     * @param clase La clase de entidad.
     * @param propiedad1 Propiedad en la cual se debe buscar.
     * @param valor1 valor de búsqueda.
     * @param propiedad2 Propiedad en la cual se debe buscar
     * @param valor2 Valor de búsqueda.
     * @param propiedad3 Propiedad en la cual se debe buscar
     * @param valor3 Valor de búsqueda.
     * @param propiedad4
     * @param valor4
     * @return true si existe, caso contrario false.
     * @throws Exception Si existe un error.
     */
    public boolean existePorCampo(Class clase, String propiedad1, Object valor1, String propiedad2, Object valor2, String propiedad3, Object valor3, String propiedad4, Object valor4) throws Exception;

    /**
     * Modifica un registro en la tabla agenda cambiando su estado a 1 en
     * auditoria grabando como que se creo un turnoa La clase de entidad (EJB3).
     * <p /> Detalle:<br /> UPDATE T SET (...) = (...) WHERE ID = ... <p />
     * Modifica los atributos de UN registro de la tabla T que corresponda a la
     * clave primaria que se encuentra en la entidad. <br />
     *
     * @param entity La entidad a modificar.
     * @param user El usuario que modifica la entidad.
     * @throws Exception Si existe un error.
     */
    public void reagendarTurno(T entity, Object user) throws Exception;

    public Date getFechaDb() throws Exception;

    /**
     * Obtiene valor máximo del campo para el objeto asociado a La clase de
     * entidad (EJB3). <p /> Detalle:<br /> SELECT MAX(T.campo) FROM T <br />
     *
     * @param clase La clase de entidad.
     * @param campo Nombre del campo.
     * @param propiedad Propiedad en la cual se debe buscar.
     * @param valor valor de búsqueda.
     * @return El valor máximo.
     * @throws Exception Si existe un error.
     */
    public Date getMax(Class clase, String campo, String propiedad, Object valor) throws Exception;

    /**
     * Lista los elementos de acuerdo al operador logico asignado al query
     * entidad (EJB3). <p /> Detalle:<br /> SELECT * FROM T where operadorLogico
     * = :valor <br />
     *
     * @param clase La clase de entidad.
     * @param operadorLogico El operador logico parametro
     * @param propiedad Propiedad en la cual se debe buscar.
     * @param propiedad1 Propiedad en la cual se hacer el where
     * @param valor valor de búsqueda.
     * @param valor1 valor de la propiedad 2
     * @param sortColumn Columna para ordenar
     * @param asc Boolean en case de ser ascendente o descendente
     * @return El valor máximo.
     * @throws Exception Si existe un error.
     */
    public List<T> listarOpLogicoParamOrdenada(Class clase, String propiedad, Object valor, String propiedad1, String operadorLogico, Object valor1, String sortColumn, boolean asc) throws Exception;

    /**
     * Modifica una lista grabando en auditoria el usuario que grabo las listas
     * auditoria grabando como que se creo un turnoa La clase de entidad (EJB3).
     * <p /> Detalle:<br /> UPDATE T SET (...) = (...) WHERE ID = ... <p />
     * Modifica los atributos de UN registro de la tabla T que corresponda a la
     * clave primaria que se encuentra en la entidad. <br />
     *
     * @param clase
     * @param lista La lista a modificar.
     * @param user El usuario que modifica la entidad.
     * @throws Exception Si existe un error.
     */
    public void grabarListas(Class clase, List<T> lista, Object user) throws Exception;

//REPORTES
    /**
     * Genera el reporte de
     *
     * @param objeto, un objeto, por lo general en estos reporte es la
     * AdmEmpresa que da el servicio de seguridad
     * @param nombreReporte Nombre jasper
     * @param valorTipoReporte pdf o excel
     * @param nombreArchivo
     * @return
     * @throws java.lang.Exception descripcion de la ecepcion si ocurre un error
     */
    public String generarReporteStandar(T objeto, String nombreReporte, String valorTipoReporte, String nombreArchivo) throws Exception;

    /**
     * Genera el reporte de
     *
     * @param objeto, un objeto, por lo general en estos reporte es la
     * AdmEmpresa que da el servicio de seguridad
     * @param nombreReporte Nombre jasper
     * @param valorTipoReporte pdf o excel
     * @param nombreInstitucion Nombre de la institucion
     * @param nombreDepartamento Nombre del departamento
     * @return
     * @throws java.lang.Exception descripcion de la ecepcion si ocurre un error
     */
    public String generarReporteStandarExplorador(T objeto, String nombreReporte, String valorTipoReporte, String nombreInstitucion, String nombreDepartamento) throws Exception;

    /**
     * Genera el reporte de
     *
     * @param listaObjetos, listado de registros
     * @param nombreReporte Nombre jasper
     * @param valorTipoReporte pdf o excel
     * @param nombreArchivo Nombre del archivo
     * @return
     * @throws java.lang.Exception descripcion de la ecepcion si ocurre un error
     */
    public String generarReporte(List<T> listaObjetos, String nombreReporte, String valorTipoReporte, String nombreArchivo) throws Exception;

    /**
     * Genera el reporte de
     *
     * @param listaObjetos, listado de registros
     * @param nombreReporte Nombre jasper
     * @param valorTipoReporte pdf o excel
     * @param nombreArchivo Nombre del archivo
     * @param parametro1 parametro entero
     * @return
     * @throws java.lang.Exception descripcion de la ecepcion si ocurre un error
     */
    public String generarReporte(List<T> listaObjetos, String nombreReporte, String valorTipoReporte, String nombreArchivo, int parametro1) throws Exception;

    /**
     * Genera el reporte de
     *
     * @param listaObjetos, listado de registros
     * @param nombreReporte Nombre jasper
     * @param valorTipoReporte pdf o excel
     * @return
     * @throws java.lang.Exception
     */
    public String generarReporteExplorador(List<T> listaObjetos, String nombreReporte, String valorTipoReporte) throws Exception;

    /**
     * Metodo para generar el reporte en diferentes formatos usando
     * JavaBeanDatasource
     *
     * @param tipoReporte, formato del reporte como pdf, excel
     * @param parametrosReporte
     * @param listado
     * @param nombreArchivo
     * @throws ClassNotFoundException
     * @throws javax.servlet.ServletException
     * @throws java.io.IOException
     */
    public void generarReporte(String tipoReporte, ParametrosReporte parametrosReporte, List<T> listado, String nombreArchivo) throws Exception;

    /**
     * Metodo para generar el reporte en el explorador de windows para PDF
     * usando JavaBeanDatasource
     *
     * @param tipoReporte, formato del reporte comt parameters
     * @param parametrosReporte
     * @param listado
     * @throws ClassNotFoundException
     * @throws javax.servlet.ServletException
     * @throws java.io.IOException
     */
    public void generarReporteExplorador(String tipoReporte, ParametrosReporte parametrosReporte, List<T> listado) throws Exception;

    /**
     * Permite generar reportes sin data source en contraposición, se se envía
     * la conexion como parámetro
     *
     * @param tipoReporte
     * @param parametrosReporte
     * @param nombreArchivo
     * @throws ClassNotFoundException
     */
    public void generarReporteSinDataSource(String tipoReporte, ParametrosReporte parametrosReporte, String nombreArchivo) throws Exception;

    /**
     * Permite generar reportes sin data source en contraposición, se se envía
     * la conexion como parámetro
     *
     * @param tipoReporte
     * @param parametrosReporte
     * @throws ClassNotFoundException
     */
    public void generarReporteSinDataSourceExplorador(String tipoReporte, ParametrosReporte parametrosReporte) throws Exception;

    /**
     * Permite generar reportes sin data source y en formato Excel 2007-2010
     *
     * @param tipoReporte
     * @param parametrosReporte
     * @param nombreArchivo
     * @throws ClassNotFoundException
     */
    public void generarReporteSinDataSourceXlsx(String tipoReporte, ParametrosReporte parametrosReporte, String nombreArchivo) throws Exception;

    /**
     * Permite generar reportes sin data source y formato excel 2003
     *
     * @param tipoReporte
     * @param parametrosReporte
     * @throws ClassNotFoundException
     */
    public void generarReporteSinDataSourceXls(String tipoReporte, ParametrosReporte parametrosReporte) throws Exception;
}
